GtkWidget: Add a vfunc for queue_draw_region
authorAlexander Larsson <alexl@redhat.com>
Thu, 2 May 2013 09:08:10 +0000 (11:08 +0200)
committerAlexander Larsson <alexl@redhat.com>
Tue, 7 May 2013 14:34:05 +0000 (16:34 +0200)
Since widgets now cache drawn state we allow them to override
queue_draw_region to detect when some region of the widget
should be redrawn. For instance, if a widget draws the
background color in a pixel cache we will need to invalidate
that when the style context changes which queues a repaint.

gtk/gtkwidget.c
gtk/gtkwidget.h

index 737d5b2f29d319d277e61e6d67b38aa654fb987d..19e026a401a9f5b5a2cd0ee5ac5690c64bab642f 100644 (file)
@@ -751,6 +751,8 @@ static void             gtk_widget_real_get_width_for_height    (GtkWidget
                                                                  gint             *natural_width);
 static void             gtk_widget_real_state_flags_changed     (GtkWidget        *widget,
                                                                  GtkStateFlags     old_state);
+static void             gtk_widget_real_queue_draw_region       (GtkWidget         *widget,
+                                                                const cairo_region_t *region);
 static const GtkWidgetAuxInfo* _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget);
 static GtkWidgetAuxInfo* gtk_widget_get_aux_info                (GtkWidget        *widget,
                                                                  gboolean          create);
@@ -1078,6 +1080,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->adjust_baseline_request = gtk_widget_real_adjust_baseline_request;
   klass->adjust_size_allocation = gtk_widget_real_adjust_size_allocation;
   klass->adjust_baseline_allocation = gtk_widget_real_adjust_baseline_allocation;
+  klass->queue_draw_region = gtk_widget_real_queue_draw_region;
 
   g_object_class_install_property (gobject_class,
                                   PROP_NAME,
@@ -4972,6 +4975,15 @@ gtk_widget_unrealize (GtkWidget *widget)
  * Draw queueing.
  *****************************************/
 
+static void
+gtk_widget_real_queue_draw_region (GtkWidget         *widget,
+                                  const cairo_region_t *region)
+{
+  GtkWidgetPrivate *priv = widget->priv;
+
+  gdk_window_invalidate_region (priv->window, region, TRUE);
+}
+
 /**
  * gtk_widget_queue_draw_region:
  * @widget: a #GtkWidget
@@ -5009,7 +5021,7 @@ gtk_widget_queue_draw_region (GtkWidget            *widget,
     if (!gtk_widget_get_mapped (w))
       return;
 
-  gdk_window_invalidate_region (priv->window, region, TRUE);
+  WIDGET_CLASS (widget)->queue_draw_region (widget, region);
 }
 
 /**
index 0365e06960ededd4754a0508df57b11c9bfc8f98..25247d57012a7386fe219c3a9f8dd0cd1d0eb38e 100644 (file)
@@ -444,13 +444,14 @@ struct _GtkWidgetClass
                                            gint              *natural_baseline);
   void         (* adjust_baseline_allocation) (GtkWidget         *widget,
                                               gint              *baseline);
+  void         (*queue_draw_region)           (GtkWidget         *widget,
+                                              const cairo_region_t *region);
 
   /*< private >*/
 
   GtkWidgetClassPrivate *priv;
 
   /* Padding for future expansion */
-  void (*_gtk_reserved5) (void);
   void (*_gtk_reserved6) (void);
   void (*_gtk_reserved7) (void);
 };